package ch2.forkjoin;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

/**
 * 类说明：遍历指定目录（含子目录）找寻指定类型文件
 */
public class FindDirsFiles {

    /**
     * 任务类
     */
    private static class FindDirsFilesTask extends RecursiveAction {
        private File file;

        FindDirsFilesTask(File file) {
            this.file = file;
        }

        @Override
        protected void compute() {
            //存放每一个任务
            List<FindDirsFilesTask> subTasks = new ArrayList<>();

            File[] files = file.listFiles();
            if (files != null) {
                for (File file : files) {
                    if (file.isDirectory()) {
                        // 对每个子目录都新建一个子任务。
                        subTasks.add(new FindDirsFilesTask(file));
                    } else {
                        // 遇到文件，检查。
                        if (file.getAbsolutePath().endsWith("txt")) {
                            System.out.println("文件:" + file.getAbsolutePath());
                        }
                    }
                }
                if (!subTasks.isEmpty()) {
                    // 在当前的 ForkJoinPool 上调度所有的子任务。
                    for (FindDirsFilesTask subTask : invokeAll(subTasks)) {
                        subTask.join();
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        try {
            //1.标准范式1：new出池的实例
            ForkJoinPool pool = new ForkJoinPool();
            //2.标准范式2：new出任务
            FindDirsFilesTask task = new FindDirsFilesTask(new File("D:/"));
            /*3.标准范式2：异步提交  同步用invoke*/
            pool.execute(task);

            /*主线程做自己的业务工作*/
            System.out.println("MainTask is Running......");
            Thread.sleep(1);
            int otherWork = 0;
            for (int i = 0; i < 100; i++) {
                otherWork = otherWork + i;
            }
            System.out.println("Main Thread done sth......,otherWork=" + otherWork);
            task.join();//阻塞方法
            System.out.println("Task end");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
